home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / cprog.EXE / VIEWDIR.C < prev    next >
C/C++ Source or Header  |  1995-10-02  |  6KB  |  303 lines

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <sys\types.h>
  4. #include <sys\stat.h>
  5. #include <io.h>
  6. #include <share.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <dos.h>
  10. #include <share.h>
  11. #include <conio.h>
  12. #include <limits.h>
  13. #include <direct.h>
  14. #include "view.h"
  15.  
  16. /*
  17.   View directory selection routines
  18. */
  19.  
  20. #if VIEW_HAS_DIR
  21.  
  22. int view_dir( UCHAR *name )
  23. {
  24.   int  err;
  25.   int  c1,c2;
  26.   int  olddrive;
  27.   int  newdrive;
  28.   char *test;
  29.   int  row;
  30.   DIRLIST *dir = NULL;
  31.   DIRLIST *cur = NULL;
  32.   VIEWSAVE *vs;
  33.  
  34.   vs = view_getsave(VIEW_DIR_ROW     ,VIEW_DIR_COL,
  35.                     VIEW_DIR_HEIGHT+2,VIEW_DIR_WIDTH+2);
  36.  
  37.   do
  38.     {
  39.     *name = '\0';
  40.     dir   = view_getlist();
  41.  
  42.     view_attr = GET_STRING;
  43.     view_frame(getcwd(view_line,VIEW_MAX_LINE),
  44.                VIEW_DIR_ROW     ,VIEW_DIR_COL,
  45.                VIEW_DIR_HEIGHT+2,VIEW_DIR_WIDTH+2);
  46.  
  47.     view_dirdisp( dir );
  48.  
  49.     row = 0;
  50.     cur = dir;
  51.     err = FALSE;
  52.  
  53.     do
  54.       {
  55.       view_attr = GET_STRING_CURSOR;
  56.       view_goto(VIEW_DIR_ROW+1+row,VIEW_DIR_COL+1);
  57.       view_puts(cur->line,VIEW_DIR_WIDTH);
  58.  
  59.       c1 = getch();
  60.  
  61.       switch( c1 )
  62.         {
  63.         case 0:
  64.           c2 = getch();
  65.     
  66.           switch(c2)
  67.             {
  68.             case CURSOR_DOWN:
  69.               if (cur->next)
  70.                 {
  71.                 cur = cur->next;
  72.                 row ++;
  73.                 }
  74.             break;
  75.     
  76.             case CURSOR_UP:
  77.               if (cur->prev)
  78.                 {
  79.                 cur = cur->prev;
  80.                 row --;
  81.                 }
  82.             break;
  83.     
  84.             case PGDN:
  85.               for (row = 0,cur=dir; row < VIEW_DIR_HEIGHT && cur->next; row ++,cur = cur->next);
  86.               dir = cur;
  87.               row = 0;
  88.             break;
  89.     
  90.             case PGUP:
  91.               for (row = 0,cur=dir; row < VIEW_DIR_HEIGHT && cur->prev; row ++,cur = cur->prev);
  92.               dir = cur;
  93.               row = 0;
  94.             break;
  95.     
  96.             case HOME:
  97.               for (cur = dir; cur->prev; cur=cur->prev);
  98.               dir = cur;
  99.               row = 0;
  100.             break;
  101.     
  102.             case END:
  103.               for (cur = dir; cur->next; cur=cur->next);
  104.               dir = cur;
  105.               row = 0;
  106.             break;
  107.     
  108.             default:
  109.             continue;
  110.             }
  111.         break;
  112.     
  113.         case RETURN:
  114.           for (c2 = 0; c2 < 13 && cur->line[c2] != ' '; c2 ++);
  115.           cur->line[c2] = '\0';
  116.  
  117.           if (cur->line[14] == 'd')
  118.             chdir(cur->line);
  119.           else
  120.             {
  121.             strcpy(name,cur->line);
  122.             err = TRUE;
  123.             }
  124.  
  125.           cur->line[c2] = ' ';
  126.         break;
  127.     
  128.         case ESC:
  129.           err = TRUE;
  130.         break;
  131.     
  132.         default:
  133.           c1 = toupper(c1);
  134.  
  135.           if (c1 >= 'A' && c1 <= 'Z')
  136.             {
  137.             newdrive = (c1-'A')+1;
  138.             _dos_getdrive(&olddrive);
  139.             _dos_setdrive(newdrive,&c2);
  140.  
  141.             test = getcwd(NULL,66);
  142.  
  143.             if (!test)
  144.               _dos_setdrive(olddrive,&c2);
  145.             else
  146.               free(test);
  147.  
  148.             c1 = RETURN;
  149.             break;
  150.             }
  151.  
  152.         continue;
  153.         }
  154.  
  155.       if (row < 0)
  156.         {
  157.         row = 0;
  158.         dir = dir->prev;
  159.         }
  160.       else if (row >= VIEW_DIR_HEIGHT)
  161.         {
  162.         row = VIEW_DIR_HEIGHT-1;
  163.         dir = dir->next;
  164.         }
  165.  
  166.       view_dirdisp( dir );
  167.       }
  168.     while(c1 != RETURN && c1 != ESC);
  169.  
  170.     dir = view_freelist( dir );
  171.     }
  172.   while(!err);
  173.  
  174.   view_putsave(vs);
  175.  
  176.   if (c1 == ESC)
  177.     return(FALSE);
  178.   else
  179.     return(TRUE);
  180. }
  181.  
  182.  
  183. void view_dirdisp( DIRLIST *dir )
  184. {
  185.    int row = 0;
  186.  
  187.    view_attr = GET_STRING;
  188.    do
  189.      {
  190.      view_goto(VIEW_DIR_ROW+1+row,VIEW_DIR_COL+1);
  191.      if (dir)
  192.        {
  193.        view_puts(dir->line,VIEW_DIR_WIDTH);
  194.        dir = dir->next;
  195.        }
  196.      else
  197.        view_fill(' ',VIEW_DIR_WIDTH);
  198.      row ++;
  199.      }
  200.    while(row < VIEW_DIR_HEIGHT);
  201. }
  202.  
  203. DIRLIST *view_freelist( DIRLIST *dir )
  204. {
  205.   DIRLIST *cur;
  206.  
  207.   while( dir->prev ) dir = dir->prev;
  208.  
  209.   do
  210.     {
  211.     cur = dir; 
  212.     dir = dir->next; 
  213.     free(cur->line);
  214.     free(cur);
  215.     }
  216.   while(dir);
  217.  
  218.   return(dir);
  219. }
  220.  
  221.  
  222. DIRLIST *view_getlist ( void )
  223. {
  224.   int  err;
  225.   struct find_t file;
  226.   DIRLIST *dir = NULL;
  227.  
  228.   for (err = _dos_findfirst("*.*",_A_SUBDIR,&file); !err ; err = _dos_findnext(&file))
  229.     {
  230.     if (file.attrib & _A_SUBDIR)
  231.       dir = view_addline( dir, &file );
  232.     }
  233.  
  234.   for (err = _dos_findfirst("*.*",_A_NORMAL,&file); !err ; err = _dos_findnext(&file))
  235.     {
  236.     if (!(file.attrib & _A_SUBDIR))
  237.       dir = view_addline( dir, &file );
  238.     }
  239.  
  240.   while(dir->prev) dir = dir->prev;
  241.  
  242.   return(dir);
  243. }
  244.  
  245. DIRLIST *view_addline(DIRLIST *dir, struct find_t *file)
  246. {
  247.   DIRLIST *cur;
  248.  
  249.   cur = malloc(sizeof(DIRLIST));
  250.   if (!cur) view_error(1,"VIEW0004");
  251.  
  252.   cur->line = malloc(VIEW_DIR_WIDTH+1);
  253.   if (!cur->line) view_error(1,"VIEW0005");
  254.  
  255.   if (dir)
  256.     {
  257.     cur->prev = dir;
  258.     cur->next = NULL;
  259.     dir->next = cur;
  260.     dir       = cur;
  261.     }
  262.   else
  263.     {
  264.     cur->next = NULL;
  265.     cur->prev = NULL;
  266.     dir = cur;
  267.     }
  268.  
  269.   view_fmtline(cur->line,file);
  270.  
  271.   return(dir);
  272. }
  273.  
  274. void view_fmtline(UCHAR *line, struct find_t *file)
  275. {
  276.   int idx;
  277.   UCHAR *tmp;
  278.  
  279.   for (idx = 0; idx < VIEW_DIR_WIDTH; idx ++) line[idx] = ' ';
  280.   line[VIEW_DIR_WIDTH] = '\0';
  281.  
  282.   memmove(line,file->name,strlen(file->name));
  283.  
  284.   if (file->attrib & _A_SUBDIR) 
  285.     line[14] = 'd';
  286.   else 
  287.     line[14] = ' ';
  288.  
  289.   memmove(line+17,view_ultoa((ULONG)((file->wr_date  & 0x01E0) >> 5 ),10,2,'0'),2);
  290.   line[19] = '/';
  291.   memmove(line+20,view_ultoa((ULONG)( file->wr_date  & 0x001F       ),10,2,'0'),2);
  292.   line[22] = '/';
  293.   memmove(line+23,view_ultoa((ULONG)(((file->wr_date & 0xFE00) >> 9 )+80),10,2,'0'),2);
  294.  
  295.   memmove(line+27,view_ultoa((ULONG)((file->wr_time  & 0xF800) >> 11),10,2,'0'),2);
  296.   line[29] = ':';
  297.   memmove(line+30,view_ultoa((ULONG)((file->wr_time  & 0x07E0) >> 5 ),10,2,'0'),2);
  298.  
  299.   if (!(file->attrib & _A_SUBDIR))
  300.     memmove(line+34,view_ultoa((ULONG)file->size,10,10,' '),10);
  301. }
  302. #endif /* VIEW_HAS_DIR */
  303.